Java Assignment Rehberi – Stack, Heap, Pass-by-Value

Java’da assignment (atama) konusunu gerçekten anlamak istiyorsan, sadece “değer kopyalanır” demek yetmez. Çünkü işin içine stack & heap, primitive vs reference, casting, scope, shadowing ve özellikle pass-by-value girince çoğu kişinin kafası karışıyor.

Bu rehber, özellikle SCJP / OCA-OCP tarzı Java sınavlarında çok çıkan tuzakları netleştirir ve bol örnekle konuyu oturtur.


1) Stack ve Heap: Java’nın Hafıza Yapısı

Java programlarında bellek kabaca iki ana alanda düşünülür:

  • Stack: Metot çağrıları, local değişkenler, parametreler
  • Heap: Nesneler (new), instance variable’lar, array’ler

Altın kural: Değişken stack’te, nesne heap’te yaşar.

class Dog {
  String name;   // instance variable - heap
  Collar c;      // instance variable - heap

  public static void main(String[] args) {
    Dog d = new Dog();  // d -> stack, Dog object -> heap
    d.go(d);
  }

  void go(Dog dog) {     // dog -> stack (reference copy)
    c = new Collar();    // Collar object -> heap
    dog.setName("Aiko");
  }

  void setName(String dogName) {
    name = dogName;
  }
}

class Collar { }

Burada kritik nokta şudur: d ve dog iki farklı stack değişkenidir ama heap’te aynı Dog nesnesini işaret ederler.


2) Primitive vs Reference Assignment

Primitive tipler (değer kopyalanır)

Primitive tiplerde atama, direkt değerin kopyalanması demektir. Bu yüzden değişkenler birbirinden bağımsız çalışır.

int a = 10;
int b = a;
b = 30;

System.out.println(a); // 10
System.out.println(b); // 30

✅ Sonuç: a değişmez, çünkü b tamamen ayrı bir değere sahiptir.

Reference tipler (referans kopyalanır)

Reference tiplerde kopyalanan şey nesnenin kendisi değil, nesnenin adresi / referansıdır.

import java.awt.Dimension;

Dimension a = new Dimension(5, 10);
Dimension b = a;

b.height = 30;

System.out.println(a.height); // 30

✅ Çünkü a ve b aynı heap nesnesini paylaşır.


3) String Neden Farklı?

String’ler reference tip olmasına rağmen, immutable (değiştirilemez) oldukları için “farklı” davranır.

String x = "Java";
String y = x;

x = x + " Bean";

System.out.println(y); // Java
System.out.println(x); // Java Bean

Burada String nesnesi “içerik olarak” değişmez. Yeni bir String üretilir ve x artık yeni nesneyi gösterir.

⚠️ Sınav tuzağı: String referansı paylaşılsa bile içerik değişmiyor gibi görünür, çünkü aslında her değişiklik yeni nesne üretir.


4) Pass-by-Value (En Kritik Konu)

✅ Java’da parametre aktarımı %100 pass-by-value’dur. Yani metoda gönderilen şey kopyadır.

Primitive parametre

static void modify(int n) {
  n++;
}

int a = 1;
modify(a);

System.out.println(a); // 1

Çünkü metoda giden a’nın kopyasıdır.

Object parametre

import java.awt.Dimension;

static void modify(Dimension d) {
  d.height++;
}

Dimension x = new Dimension(5, 10);
modify(x);

System.out.println(x.height); // 11

Burada metoda giden şey referansın kopyasıdır. Ama bu kopya da aynı nesneyi işaret ettiği için nesnenin içi değişebilir.

✅ Özet:

  • Java pass-by-reference değildir
  • Metot çağıranın referansını değiştiremez
  • Ama nesnenin iç alanlarını değiştirebilir

5) Shadowing (Gölgeleme)

Shadowing, aynı isimli bir parametrenin veya local değişkenin dıştaki değişkeni gizlemesi durumudur.

class Foo {
  static int size = 7;

  static void changeIt(int size) {
    size += 200;
  }

  public static void main(String[] args) {
    changeIt(size);
    System.out.println(size); // 7
  }
}

Burada metoda gelen size parametresi, sınıftaki Foo.size değişkenini gölgeler.

✅ Eğer gerçekten static değişkeni değiştirmek isteseydik:

static void changeIt(int size) {
  Foo.size += 200;
}

6) Mini Cheat Sheet

  • Local variable default değer almaz (kullanmadan önce initialize etmelisin)
  • Instance variable default değer alır (0, false, null)
  • byte + byte = int (aritmetik işlemler int’e yükseltir)
  • String immutable olduğu için değişiklik yeni nesne üretir
  • Java %100 pass-by-value
  • Shadowing fark edilmezse gizli bug çıkarır

Sonuç

Java’da atama (assignment) konusunu anlamanın en hızlı yolu, “stack’te referans, heap’te nesne” mantığını net oturtmaktır. Primitive tiplerde değer kopyalanır, reference tiplerde referans kopyalanır.

Eğer SCJP / OCP tarzı sınavlara hazırlanıyorsan, özellikle pass-by-value ve shadowing sorularına ekstra dikkat etmelisin.

Latest Software Developers - Yazılım Blog Yazarı Profil Resmi

Yazar

LatestSoftwareDevelopers

Blog where the most up-to-date software is followed. (En güncel yazılımların takip edildiği blog sitesi)

Java ile ilgili yorumlar

Yorum Paylaş

EMail Zorunlu alanlar * *